import logging
import sys
from logging.handlers import RotatingFileHandler
from pathlib import Path
from typing import Optional

class UnifiedLogger:
    """
    统一日志记录工具类
    
    功能特性：
    - 多模块共享统一日志配置
    - 支持控制台和文件双输出
    - 自动日志轮转（按文件大小）
    - 线程安全设计
    - 自定义日志格式
    - 动态配置支持
    """
    
    _initialized = False
    _log_file = "app.log"
    _max_bytes = 10 * 1024 * 1024  # 10MB
    _backup_count = 5
    _log_level = logging.INFO
    _format = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
    _datefmt = "%Y-%m-%d %H:%M:%S"

    @classmethod
    def initialize(cls,
                   log_file: str = "app.log",
                   log_level: str = "INFO",
                   max_bytes: int = 10*1024*1024,
                   backup_count: int = 5,
                   enable_console: bool = True) -> None:
        """
        初始化日志配置
        
        :param log_file: 日志文件路径
        :param log_level: 日志级别（DEBUG/INFO/WARNING/ERROR/CRITICAL）
        :param max_bytes: 单个日志文件最大字节数
        :param backup_count: 保留的备份文件数量
        :param enable_console: 是否启用控制台输出
        """
        if cls._initialized:
            return

        # 创建日志目录
        log_path = Path(log_file).parent
        log_path.mkdir(parents=True, exist_ok=True)

        # 配置根日志记录器
        logger = logging.getLogger()
        logger.setLevel(log_level.upper())

        # 清除已有处理器
        if logger.hasHandlers():
            logger.handlers.clear()

        # 创建文件处理器（带轮转功能）
        file_handler = RotatingFileHandler(
            filename=log_file,
            maxBytes=max_bytes,
            backupCount=backup_count,
            encoding="utf-8"
        )
        file_handler.setFormatter(logging.Formatter(cls._format, datefmt=cls._datefmt))
        logger.addHandler(file_handler)

        # 控制台处理器
        if enable_console:
            console_handler = logging.StreamHandler(sys.stdout)
            console_handler.setFormatter(logging.Formatter(cls._format, datefmt=cls._datefmt))
            logger.addHandler(console_handler)

        cls._log_file = log_file
        cls._max_bytes = max_bytes
        cls._backup_count = backup_count
        cls._log_level = getattr(logging, log_level.upper())
        cls._initialized = True

    @staticmethod
    def get_logger(name: Optional[str] = None) -> logging.Logger:
        """
        获取配置好的日志记录器
        
        :param name: 模块名称（默认使用调用模块名称）
        :return: 配置好的Logger实例
        """
        if not UnifiedLogger._initialized:
            UnifiedLogger.initialize()

        # 自动获取调用模块名称
        if name is None:
            # 跳过当前栈帧和logging模块的栈帧
            frame = sys._getframe(2)
            name = frame.f_globals.get("__name__", "__main__")

        return logging.getLogger(name)

# 默认初始化配置（可在项目入口处覆盖）
UnifiedLogger.initialize()

# 使用示例
if __name__ == "__main__":
    # 获取日志记录器
    logger = UnifiedLogger.get_logger()
    
    # 测试日志输出
    logger.debug("调试信息")
    logger.info("一般信息")
    logger.warning("警告信息")
    logger.error("错误信息")
    logger.critical("严重错误")